﻿using System;
using System.Text;
using System.Drawing;
using System.Buffers;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;

public static partial class glDRIVE
{
    /*
    函数 gl.gmqr
    线性最小二乘问题的Householder法
    参数 a: a[m][n]超定方程组的系数矩阵，返回时存放QR分解式中的R矩阵。
    参数 m: 方程个数，也是系数矩阵行数。
    参数 n: 未知数个数，也是系数矩阵的列数。要求 m>=n 。
    参数 b: b[m]存放方程组右端的常数向量。返回时前n个分量存放方程组的最小二乘解。
    参数 q: q[m][m]返回QR分解式中的正交矩阵Q。
    返回值 若=0则表示失败；否则表示正常。
    */

    public static string drive_gmqr()
    {
        int i, j, m, n;
        double[,] a = new double[4, 3]{
            {1.0,1.0,-1.0},
            {2.0,1.0,0.0},
            {1.0,-1.0,0.0},
            {-1.0,2.0,1.0}
        };
        double[] b = new double[4] {
            2.0, -3.0, 1.0, 4.0
        };
        double[,] q = new double[4, 4];
        m = 4;
        n = 3;

        string rs = "";
        rs += gl.html_table("Mat A:", a);
        rs += gl.html_table("Mat B:", b);

        i = gl.gmqr(a, m, n, b, q);
        if (i == 0) return "error: 0";

        rs += gl.html_table("最小二乘解", b);
        rs += gl.html_table("正交矩阵 Q:", q);
        rs += gl.html_table("矩阵 R:", a);

        return rs;
    }
}